package org.qqcui.designpattern.patterns.singleton.lazy;

/**
 * 懒汉式，写法二，虽然能够实现懒加载的效果，而且也能够保证线程安全，但是效率太低，在生产环境不建议使用
 *
 * @author cuiqingqiang
 * @version 1.0
 * @date 2020-10-16 21:41
 **/
public class SingletonTest04 {
	public static void main(String[] args) {
		System.out.println("饿懒汉写法二，线程安全方式");
		Singleton4 instance1 = Singleton4.getInstance();
		Singleton4 instance2 = Singleton4.getInstance();
		System.out.println(instance1 == instance2); // true

		System.out.println("instance1.hashCode=" + instance1.hashCode());
		System.out.println("instance2.hashCode=" + instance2.hashCode());
	}
}

/**
 * 懒汉式单例实现方式一
 * 1.私有的构造方法，防止通过new创建实例
 * 2.私有的静态成员变量
 * 3.在公共获取实例的同步方法中检查成员变量并进行初始化
 */
class Singleton4 {
	private static Singleton4 instance;

	private Singleton4() {

	}

	/**
	 * 在静态方法上加了synchronized关键字，虽说能够保证线程安全，但是效率很低
	 * 每次获取对象，都会锁定整个类
	 * @return 单例实例对象
	 */
	public static synchronized Singleton4 getInstance() {
		if (instance == null) {
			instance = new Singleton4();
		}
		return instance;
	}
}